package com.zhang.common.file;

import com.zhang.common.util.LogicUtility;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.Date;

/**
 * 新文件名生成工具类 fileNameUtil
 *
 * @author zhangxin
 * @date 2021/6/28
 */
public class FileNameUtil {

    /**
     * 生成 目标文件夹/新文件名
     * fileName: 原文件名，folder：目标文件夹，rename：是否以当前时间重命名，overwrite：是否覆盖重名文件
     * @param manager,fileName,folder,rename,overwrite
     * @return java.lang.String
     */
    public String getDestSliceFile(IFileManager manager, String fileName, String folder, boolean rename, boolean overwrite) throws IOException {
        if (folder == null || folder.length() == 0) {
            // 当前年月子节点
            folder = LogicUtility.getYearMonth(new Date());
        } else {
            // 如果是汉字，则此处需要进行反向UTF-8转码
            try {
                folder = URLDecoder.decode(folder, "UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }

        if (rename) {
            // 只使用扩展名
            String ext = LogicUtility.getFileExtension(fileName);
            return folder + "/" + System.currentTimeMillis() + "." + ext;
        }

        // 单纯文件名
        fileName = getFileName(fileName);
        String sliceFile = folder + "/" + fileName;

        if (overwrite) {
            return sliceFile;
        }

        // 不覆盖同名文件
        int nIndex = 0;
        // 是否有同名文件
        while (manager.exist(sliceFile)) {
            sliceFile = folder + "/" + getNextFilePath(fileName, ++nIndex);
        }

        return sliceFile;
    }

    public String getNextFilePath(String fileName, int i) {
        if (fileName == null || fileName.trim().length() == 0) {
            return String.valueOf(i);
        }

        // 获得扩展名
        int nIndex = fileName.lastIndexOf(".");
        if (nIndex < 0) {
            return fileName + "(" + i + ")";
        }

        String name = fileName.substring(0, nIndex);
        String ext = fileName.substring(nIndex);

        return name + "(" + i + ")" + ext;
    }

    /**
     * 获得纯文件名
     * **//**ab.txt --> **ab.txt
     * @param p
     * @return java.lang.String
     */
    public String getFileName(String p) {
        if (p == null || p.trim().length() == 0)
            return "";

        int n = p.lastIndexOf("/");
        if (n < 0) {
            n = p.lastIndexOf("\\");
        }

        if (n < 0) {
            return p;
        }

        return p.substring(n + 1);
    }
}
